#ifndef WIDGET_ENHANCED_H
#define WIDGET_ENHANCED_H

/********************************************************************
 * 时间：2023/04/20
 * 作者：HONG_KE_LI
 * 用途：本质就是提供很多对于QWidget的增强功能 通过继承的方式把功能传递下去
 *      如果你需要后续增加增强窗口的实现，则，你需要注意：
 *      * 完善文档，至少也要给予 完整的注释，因为这个类需要在全局作用
 *      * 完善测试！
 *      * 增加功能但不阻碍现有功能，并且不可以做一些自启定时器的操作！
 *          因为派生类会保存基类的一切实现，这个类几乎在全局做基类
 *          你增加了一些耗时功能进去，结果是非常可怕的。
 *
 * 现有的增强：
 *      * POWER_HINT
 *      长按x秒后出现提示窗口，以描述更多详细信息
 *
 *      * POWER_CLICKSUP
 *      像按钮一样，可以在点击时放出press与release事件
 *
 *      * POWER_DRAW_SHADOW
 *      绘制窗口阴影
 *
 * ******************************************************************/

#include <QWidget>

#include "./Tool/label_show_hint.h"

namespace owid{

class Widget_Enhanced : public QWidget
{

    Q_OBJECT

public:
    /* 开关部分增强功能
            有些时候有些增强功能并不被需要，通过此开关功能节省性能
       * 枚举名与对应的具体功能，请看最顶部的模块介绍介绍
       * 新加入枚举表时，请用位移动运算符 向后添加
       * 如果在32位系统中，此枚举表支持32位，64则64   注意 请不要添加超过32位！
            可能会引发bug的行为不要去做！实际上我也不认为这个模块最后会被添加这么多功能
       * 如果确实被加到那种程度了，记得帮我改接口，即接口：*/
    enum Enhanced_Switch{
        None = 0,                        // 不指代任何功能，其作为状态记录的初始值
        POWER_HINT = 1 << 0,            // 长按获得窗口提示
        POWER_DRAW_SHADOW = 1 << 1      // 绘制窗口阴影
    };


public:

    // global function -----------------------------------------------全局共有函数

    Widget_Enhanced(QWidget *parent = nullptr);

    // 增强功能的开启与关闭       什么可以开关请看Enhanced_Switch枚举表
    // 开启某些可以被开启的功能
    void enhanced_on(owid::Widget_Enhanced::Enhanced_Switch o_enum);
    // 关闭某些可以被关闭的功能
    void enhanced_off(owid::Widget_Enhanced::Enhanced_Switch o_enum);
    // 校验当前某功能是否开启？ 返回true则确定为启动，为false则确定为关闭
    bool enhanced_open_Or_not(owid::Widget_Enhanced::Enhanced_Switch o_enum);

    /* 项目基准样式 可以不调 ，但是调用后可以直接获得基准样式
    */
    void standard_style();

    // POWER_HINT public func --------------------------------------------

    /// * 长按x秒后出现提示窗口，以描述更多详细信息
    /// \brief set_hint_timer     设置展示提示框需要的长按时间？（单位ms）。 系统默认时间为2000ms
    /// \param o_how_time_show    设置时间，单位ms
    void POWER_HINT_timer(size_t o_how_time_show);

    /// * 长按x秒后出现提示窗口，以描述更多详细信息
    /// \brief set_hint_msg 设置提示信息的文本 设置此文本则会自动开启展示功能
    /// \param str          提示信息的内容
    /// \param font         提示信息的文字格式
    void POWER_HINT_msg(const QString &str, const QFont *font = nullptr);



    // POWER_DRAW_SHADOW public fuc———————————————————————————

    /// \brief POWER_DRAW_SHADOW_style 绘制窗口阴影，qt官方样式实现并不存在阴影，所以需要手绘
    ///     * 务必注意，这里的窗口阴影会占据窗口本身的大小。即调用本方法之前务必预流出绘制阴影的空间
    ///     * 调用本API即刻 自动开启阴影绘制
    /// \param width        阴影宽度
    /// \param intensity    阴影明暗强度（0-255，越靠近0阴影越黑，为0最黑）
    /// \param top          是否绘制上边 1 绘制 0不绘制
    /// \param right        是否绘制右边 1 绘制 0不绘制
    /// \param down         是否绘制下边 1 绘制 0不绘制
    /// \param left         是否绘制左边 1 绘制 0不绘制
    ///
    void POWER_DRAW_SHADOW_style(int width, short intensity, bool top, bool right, bool down, bool left);


signals:

    void press();             // 窗口被点击的按下
    void release();           // 窗口被点击的释放

protected:

    virtual void mousePressEvent  (QMouseEvent *event)  override;
    virtual void mouseReleaseEvent(QMouseEvent * event) override;
    virtual void paintEvent(QPaintEvent *event) override;



private:

    // global func ------------------------------------------------

    // 初始化本类的槽函数链接
    void this_connect();


    // POWER_CLICKSUP private func ------------------------------------------

    // 当点击按下触发
    void now_press();
    // 当点击离开时触发
    void now_release();


    // POWER_HINT private func -----------------------------------------------

    // 功能的定时器触发时的槽函数
    void POWER_HINT_timer_trigger();


    // POWER_DRAW_SHADOW private fuc———————————————————————————
    // 阴影绘制
    void draw_shadow();


protected:

    // 阴影绘制参数————POWER_DRAW_SHADOW
    int   pds_width     ;   //  阴影宽度_也是边距
    short pds_intensity ;   // 阴影明暗强度（0-255，越靠近0阴影越黑，为0最黑）
    bool  pds_top       ;   // 是否绘制上边 1 绘制 0不绘制
    bool  pds_right     ;   // 是否绘制右边 1 绘制 0不绘制
    bool  pds_down      ;   // 是否绘制下边 1 绘制 0不绘制
    bool  pds_left      ;   // 是否绘制左边 1 绘制 0不绘制

    short pds_step_size ;   // 步长


private:

    // global data ---------------------------------------------------

    // 增强功能们是开启还是关闭 的状态 的计算参数
    size_t enhanced_switch;


    // POWER_HINT data --------------------------------------------------

    // 用户长按多少时间以后 提示信息会被展示出来？
    size_t _power_hint_durationClick;
    // 记录应该给用户展示什么提示信息
    QString _power_hint_string;
    // 定时器
    QSharedPointer<QTimer> _power_hint_timer;
    // 展示提示信息的窗口
    QSharedPointer<owid::Label_Show_Hint> hint_wid;

};


}




#endif // WIDGET_ENHANCED_H
